package vip.liux.backend.adapter.web;

import org.springframework.web.bind.annotation.*;
import vip.liux.application.dots.ListResultDto;
import vip.liux.application.dots.PagedResultDto;
import vip.liux.backend.application.service.files.DirectoryDescriptorAppService;
import vip.liux.backend.application.service.files.dtos.*;

@RestController
@RequestMapping("/api/file-management/directory-descriptor")
public class DirectoryDescriptorController {

    protected final DirectoryDescriptorAppService directoryDescriptorAppService;

    public DirectoryDescriptorController(DirectoryDescriptorAppService directoryDescriptorAppService) {
        this.directoryDescriptorAppService = directoryDescriptorAppService;
    }

    /**
     * 根据ID获取目录描述符
     *
     * @param id 目录ID
     * @return 目录描述符
     */
    @GetMapping("/{id}")
    public DirectoryDescriptorDto get(@PathVariable Long id) {
        return directoryDescriptorAppService.get(id);
    }

    /**
     * 获取子目录列表
     *
     * @param parentId 父目录ID
     * @return 子目录列表
     */
    @GetMapping("/sub-directories")
    public ListResultDto<DirectoryDescriptorInfoDto> getList(@RequestParam(required = false) Long parentId) {
        return directoryDescriptorAppService.getList(parentId);
    }


    /**
     * 获取子目录列表
     *
     * @param parentId 父目录ID
     * @return 子目录列表
     */
    @GetMapping("/tree")
    public ListResultDto<DirectoryDescriptorInfoDto> getTreeList(@RequestParam(required = false) Long parentId) {
        return directoryDescriptorAppService.getTreeList(parentId);
    }

    /**
     * 创建目录
     *
     * @param input 创建目录输入
     * @return 创建的目录描述符
     */
    @PostMapping
    public DirectoryDescriptorDto create(@RequestBody CreateDirectoryInput input) {
        return directoryDescriptorAppService.create(input);
    }

    /**
     * 重命名目录
     *
     * @param id    目录ID
     * @param input 重命名输入
     * @return 重命名后的目录描述符
     */
    @PostMapping("/{id}")
    public DirectoryDescriptorDto rename(@PathVariable Long id, @RequestBody RenameDirectoryInput input) {
        return directoryDescriptorAppService.rename(id, input);
    }

    /**
     * 获取目录详情
     *
     * @param parentId 父目录ID
     * @param name     目录名称
     * @return 目录描述符详情
     */
    @GetMapping("/detail/{parentId}")
    public DirectoryDescriptorDto detail(@PathVariable(required = false) Long parentId, String name) {
        return directoryDescriptorAppService.detail(parentId, name);
    }

    /**
     * 获取目录内容
     *
     * @param input 目录内容请求输入
     * @return 目录内容分页结果
     */
    @GetMapping("/content")
    public PagedResultDto<DirectoryContentDto> getContent(@RequestBody DirectoryContentRequestInput input) {
        return directoryDescriptorAppService.getContent(input);
    }

    /**
     * 删除目录
     *
     * @param id 目录ID
     */
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) {
        directoryDescriptorAppService.delete(id);
    }

    /**
     * 移动目录
     *
     * @param input 移动目录输入
     * @return 移动后的目录描述符
     */
    @PostMapping("/move")
    public DirectoryDescriptorDto move(@RequestBody MoveDirectoryInput input) {
        return directoryDescriptorAppService.move(input);
    }
}